package com.xm.bean.context;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

/**
 * 构造函数注入导致的循环依赖
 *   问题：
 *      构造函数注入无法通过三级缓存解决循环依赖，
 *      因为 Bean 的实例化必须完成才能暴露引用。
 */
public class ConstructorBean01 {
    public static void main(String[] args) {
    }
}

@Component
class A{
    private final B b;
    public A(B b){
        this.b = b;
    }
}

@Component
class B{
    private final A a;
    public B(A a){
        this.a = a;
    }
}

//解决方案一：改用Setter/Field 注入：优先使用非构造函数注入
@Component
class A2{
    private B b;
    @Autowired
    public void setB(B b){// setter 注入
        this.b = b;
    }
}

//解决方案二：使用 @Lazy 延迟加载：对其中一个依赖添加 @Lazy 注解。
@Component
class A3{
    private final B b;
    public A3(@Lazy B b){// 延迟初始化 B
        this.b = b;
    }
}